package com.ccsoft.netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;

/**
 * @author chanchaw
 * @create 2022-07-17 13:53
 * 基于 Netty # ChannelInboundHandlerAdapter 制作自己的 server 端业务处理 handler
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    // ctx: 上下文对象，包含所有对象
    // msg：客户端发送来的消息对象
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        ByteBuf buf = (ByteBuf)msg;// 使用 Netty 自己封装的 ByteBuf ，前传消息对象
//        String msgString = buf.toString(CharsetUtil.UTF_8);
//        System.out.println("客户端地址是：" + ctx.channel().remoteAddress());
//        System.out.println("客户端发送来的消息是：" + msgString);

        // 上面代码是第一次实现通信，下面是将用户自定义普通任务提交到 taskQueue ，让其执行
        ctx.channel().eventLoop().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5*1000);
                    ctx.writeAndFlush(Unpooled.copiedBuffer("第一次延迟等待的消息",CharsetUtil.UTF_8));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("线程sleep后执行时出现异常");
                }
            }
        });

        ctx.channel().eventLoop().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5*1000);
                    ctx.writeAndFlush(Unpooled.copiedBuffer("第二次延迟5秒的消息",CharsetUtil.UTF_8));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("线程sleep后执行时出现异常");
                }
            }
        });

        // 执行定时任务
        ctx.channel().eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5*1000);
                    ctx.writeAndFlush(Unpooled.copiedBuffer("我是定时任务",CharsetUtil.UTF_8));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    System.out.println("线程sleep后执行时出现异常");
                }
            }
        },5, TimeUnit.SECONDS);
    }

    // 数据读取完毕后执行本方法内的逻辑
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // write后flush，发送给客户端消息，同时要使用字符编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~",CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();// 出现异常则关闭通道
    }
}
